
#include <iostream>
using namespace std;

class Point;

class Circle
{
public:
    Circle();
    ~Circle();
    void printPoint(const Point &p);
};

Circle::Circle()
{
    cout << "Circle()" << endl;
}

Circle::~Circle()
{
    cout << "~Circle()" << endl;
}


class Point
{
    // 声明友元全局函数
    friend void printPoint(const Point &p);

    // printPoint 为 Circle 类中成员函数
    friend void Circle::printPoint(const Point &p);
public:
    Point(double x, double y);
    ~Point();
private:
    double x;
    double y;
};

Point::Point(double x, double y) : x(x), y(y)
{
    cout << "Point()" << endl;
}

Point::~Point()
{
    cout << "~Point()" << endl;
}

/** 
 * 友元成员函数
 * 需要在 Point 类后面实现，否则报错：找不到 Point 类的实现
 */
void Circle::printPoint(const Point &p)
{
    // 由于声明为友元函数，可以直接访问 Point 类成员
    cout << "Point(" << p.x << ", " << p.y << ")\n";
}

// 全局函数
void printPoint(const Point &p)
{
    // 由于在 Point 类中声明为友元函数，所以可以直接访问类中成员
    cout << "Point(" << p.x << ", " << p.y << ")\n";
}

int main()
{
    // 实例化 Point 对象
    Point p(3, 4);

    // 通过全局函数可以直接访问
    // printPoint(p);
    
    Circle c;
    // Circle 类成员函数访问 Point 类成员
    c.printPoint(p);


    return 0;
}